package test;

import java.util.HashMap;
import java.util.Map;
/*
该题的解法可以使用哈希表来实现，具体步骤如下：

定义一个 Map 类型的变量 map，用于存储数据结构中出现的数字以及它们出现的次数。
对于 add 操作，将数字 number 存入 map 中，并将它的出现次数加 1。
对于 find 操作，遍历 map 中的每一个数字 num1，计算出与之配对的数字 num2（即 num2 = value - num1），
如果 num1 与 num2 相等且它们的出现次数大于 1，或者 num1 与 num2 不相等且 num2 存在于 map 中，
那么就说明找到了一对数字之和等于指定的值，返回 true。如果遍历完整个 map 后都没有找到这样的一对数字，那么返回 false。

上述代码中，我们通过 HashMap 来存储数据结构中出现的数字以及它们出现的次数。在 add 操作中，
我们可以使用 HashMap 中的 getOrDefault() 方法，避免了使用 if 判断来处理新元素和已经存在元素的情况，这样代码更简洁。

在 find 操作中，我们遍历 HashMap 中的每一个数字 num1，计算出与之配对的数字 num2，并判断它们是否满足条件。如果遍历完整个 HashMap 后都没有找到这样的一对数字，那么就说明没有数字之和等于指定的值，返回 false。

该算法的时间复杂度为 O(n)，其中 n 表示数据结构中的元素数量。由于每个元素最多只会被遍历一次，所以空间复杂度为 O(n)。
 */
public  class TwoSum {
    public static void main(String[] args) {
        TwoSum twoSum = new TwoSum();
        twoSum.add(1);
        twoSum.add(3);
        twoSum.add(5);
        System.out.println(twoSum.find(4)); // 返回 true
        System.out.println(twoSum.find(7)); // 返回 true
        System.out.println(twoSum.find(8)); // 返回 false
    }
    private Map<Integer, Integer> map;

    /** Initialize your data structure here. */
    public TwoSum() {
        map = new HashMap<>();
    }

    /** Add the number to an internal data structure.. */
    public void add(int number) {
        map.put(number, map.getOrDefault(number, 0) + 1);
    }

    /** Find if there exists any pair of numbers which sum is equal to the value. */
    public boolean find(int value) {
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            int num1 = entry.getKey();
            int num2 = value - num1;
            if (num1 == num2 && entry.getValue() > 1) {
                return true;
            } else if (num1 != num2 && map.containsKey(num2)) {
                return true;
            }
        }
        return false;
    }
}
